package com.hq.modeapp.tools;

import java.math.BigDecimal;
import java.security.MessageDigest;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;
import android.widget.Toast;

/**
 * ********************************************************** 内容摘要 ：工具类
 * <p>
 * 
 * 作者 ： 创建时间 ：2013-4-25 上午10:25:40 当前版本号：v1.0 历史记录 : 日期 : 2013-4-25 上午10:25:40
 * 修改人： 描述 :
 *********************************************************** 
 */
public class Tools {

	private Toast toast = null;
	private static Tools tools = null;

	public static Tools getInstance() {
		if (tools == null) {
			tools = new Tools();
		}
		return tools;
	}

	/**
	 * 弹出土司
	 * 
	 * @param context
	 * @param msg
	 */
	public void showTextToast(Context context, String msg) {
		if (toast == null) {
			toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
		} else {
			toast.setText(msg);
		}
		toast.show();
	}

	/**
	 * 
	 * 函数名称 : sub 功能描述 : 两数相减 参数及返回值说明：
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-18 下午6:04:00 修改人：zcy 描述 ：
	 * 
	 */
	public static double sub(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 
	 * 函数名称 : add 功能描述 : 两数相加 参数及返回值说明：
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-18 下午6:04:44 修改人：zcy 描述 ：
	 * 
	 */
	public static double add(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.add(b2).doubleValue();
	}

	/**
	 * 
	 * 函数名称 : round 功能描述 : 四舍五入 参数及返回值说明：
	 * 
	 * @param v
	 * @param scale
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-18 下午6:04:54 修改人：zcy 描述 ：
	 * 
	 */
	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");// 保留小数点两位有效数字
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 
	 * 函数名称 : mul 功能描述 : 两数相乘 参数及返回值说明：
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-19 上午10:02:21 修改人：zcy 描述 ：
	 * 
	 */
	public static double mul(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 
	 * 函数名称 : mul 功能描述 : 除 参数及返回值说明：
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-22 下午5:49:14 修改人：sq 描述 ：
	 * 
	 */
	public double div(double v1, int v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 
	 * 函数名称 : isPicture 功能描述 : 判断是否为图片 jpg jpge gif 参数及返回值说明：
	 * 
	 * @param imagePath
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-20 下午2:49:44 修改人：zcy 描述 ：
	 * 
	 */
	public static boolean isPicture(String imagePath) {

		if (imagePath.equals("") || !imagePath.contains(".")) {
			return false;
		} else {
			String imageStyle = imagePath.substring(imagePath.lastIndexOf('.'));

			if (imageStyle.equals(".jpg") || imageStyle.equals(".jpge")
					|| imageStyle.equals(".gif") || imageStyle.equals(".png")) {
				return true;
			} else {
				return false;
			}
		}

	}

	/**
	 * 
	 * 函数名称 : getVerCode 功能描述 : 获取版本号 参数及返回值说明：
	 * 
	 * @param _context
	 * @param _package
	 * @return
	 * 
	 *         修改记录： 日期：2012-12-26 下午4:04:42 修改人：sq 描述 ：
	 * 
	 */
	public String getVersionName(Context context) {
		// 获取packagemanager的实例
		PackageManager packageManager = context.getPackageManager();
		// getPackageName()是你当前类的包名，0代表是获取版本信息
		PackageInfo packInfo = null;
		try {
			packInfo = packageManager.getPackageInfo(context.getPackageName(),
					0);
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return packInfo.versionName;
	}

	public boolean doubleTocompare(Context context, String vs_server) {
		try {
			double d1 = Double.valueOf(vs_server);
			double d2 = Double.valueOf(getVersionName(context));
			if (d1 > d2) {
				return false;
			}
			return true;
		} catch (NumberFormatException e) {
			e.printStackTrace();

		}
		return true;
	}

	/**
	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
	 */
	public int dipTopx(Context context, float dpValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}

	/**
	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
	 */
	public int pxTodip(Context context, float pxValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (pxValue / scale + 0.5f);
	}
	/**
	 * 
	 *  @函数名称 : getScreenWidth
	 *  @功能描述 :  屏幕的宽
	 *  @参数及返回值说明：
	 *  	@param activity
	 *  	@return
	 *
	 *  @修改记录：
	 *  @日期：2013-5-17 上午11:10:00	修改人：黄秋
	 *  @描述	：
	 *
	 */
	public int getScreenWidth(Activity activity) {
		DisplayMetrics dm = new DisplayMetrics();
		// 获取屏幕信息
		activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
		int screenWidth = dm.widthPixels;
		int screenHeigh = dm.heightPixels;
		return screenWidth;
	}
	/**
	 * 
	 *  @函数名称 : getScreenHeigh
	 *  @功能描述 :  屏幕的宽
	 *  @参数及返回值说明：
	 *  	@param activity
	 *  	@return
	 *
	 *  @修改记录：
	 *  @日期：2013-5-17 上午11:10:00	修改人：黄秋
	 *  @描述	：
	 *
	 */
	public int getScreenHeigh(Activity activity) {
		DisplayMetrics dm = new DisplayMetrics();
		// 获取屏幕信息
		activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
		int screenWidth = dm.widthPixels;
		int screenHeigh = dm.heightPixels;
		return screenHeigh;
	}
	/**
	 * 
	 * 函数名称 : getIpAddress 功能描述 : WIFI状态下获取IP 参数及返回值说明：
	 * 
	 * @param context
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-24 上午11:26:26 修改人：zcy 描述 ：
	 * 
	 */
	public String getIpAddress(Context context) {
		// 获取wifi服务
		WifiManager wifiManager = (WifiManager) context
				.getSystemService(Context.WIFI_SERVICE);
		// 判断wifi是否开启
		if (!wifiManager.isWifiEnabled()) {
			wifiManager.setWifiEnabled(true);
		}
		WifiInfo wifiInfo = wifiManager.getConnectionInfo();
		int ipAddress = wifiInfo.getIpAddress();
		String ip = intToIp(ipAddress);
		return ip;
	}

	private String intToIp(int i) {

		return (i & 0xFF) + "." +

		((i >> 8) & 0xFF) + "." +

		((i >> 16) & 0xFF) + "." +

		(i >> 24 & 0xFF);

	}

	/***
	 * MD5加码 生成32位md5码
	 */
	public static String string2MD5(String inStr) {
		MessageDigest md5 = null;
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (Exception e) {
			System.out.println(e.toString());
			e.printStackTrace();
			return "";
		}
		char[] charArray = (inStr + "ljsheng").toCharArray();
		byte[] byteArray = new byte[charArray.length];

		for (int i = 0; i < charArray.length; i++)
			byteArray[i] = (byte) charArray[i];
		byte[] md5Bytes = md5.digest(byteArray);
		StringBuffer hexValue = new StringBuffer();
		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16)
				hexValue.append("0");
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();

	}

	/**
	 * 
	 * 函数名称 : getData 功能描述 : 解jason的数据（一层） 参数及返回值说明：
	 * 
	 * @param content
	 * @return
	 * 
	 *         修改记录： 日期：2013-4-29 下午5:44:26 修改人：Donghuiwu 描述 ：
	 * 
	 */
	public HashMap getData(String content) {
		HashMap<String, String> hashMap = new HashMap<String, String>();
		JSONObject jsonObject;
		String time = null;
		try {
			jsonObject = new JSONObject(content);
			Iterator<String> it = jsonObject.keys();
			while (it.hasNext()) {
				String key = it.next();
				hashMap.put(key, jsonObject.getString(key));
			}

		} catch (JSONException e) {
			e.printStackTrace();
		}
		return hashMap;
	}

	/**
	 * 
	 * @函数名称 : getCurrentTime
	 * @功能描述 : 获取当前时间的字符串
	 * @参数及返回值说明：
	 * @param pattern
	 * @return
	 * 
	 * @修改记录：
	 * @日期：2013-3-29 下午4:48:52 修改人：黄秋
	 * @描述 ：
	 * 
	 */
	public static String getCurrentTime(String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat("",
				Locale.SIMPLIFIED_CHINESE);
		// sdf.applyPattern("yyyy-MM-dd HH:mm:ss.SSS");
		// sdf.applyPattern("yyyy-MM-dd");
		sdf.applyPattern(pattern);
		String timeStr = sdf.format(new Date());
		return timeStr;
	}

	/**
	 * 
	 * @函数名称 : compareDate
	 * @功能描述 : 日期的比较
	 * @参数及返回值说明：
	 * @param date
	 * @param dateStandard
	 * @return
	 * 
	 * @修改记录：
	 * @日期：2013-3-29 下午4:49:13 修改人：黄秋
	 * @描述 ：
	 * 
	 */
	public static int compareDate(String date, String dateStandard,
			String pattern) {
		int flag = 0;
		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat df = new SimpleDateFormat(pattern);
		try {
			Date dt1 = df.parse(date);
			Date dt2 = df.parse(dateStandard);
			System.out.println("dt1.getTime()-dt2.getime()="
					+ (dt1.getTime() - dt2.getTime()));
			if (dt1.getTime() - dt2.getTime() > 1800000) {// 大于半个小时
				flag = 1;
			} else if (dt1.getTime() == dt2.getTime()) {
				flag = 0;
			} else if (dt1.getTime() < dt2.getTime()) {
				flag = -1;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return flag;
	}

}
